/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.ufpr.inf.escel.brain.model.po;

import br.ufpr.inf.escel.brain.model.DadoTeste;
import br.ufpr.inf.escel.brain.parsers.FormatarDadoTestePO;
import br.ufpr.inf.escel.consts.Constantes;
import br.ufpr.inf.escel.manager.util.Arquivo;
import com.sun.tools.javac.Main;
import java.io.File;

/**
 *
 * @author gustavo
 */
public class DadoTestePO extends DadoTeste {

    private Metodos metodos;
    private Parametros parametros;
    
    public DadoTestePO(Metodos metodos, Parametros parametros) {
        this.metodos = metodos;
        this.parametros = parametros;
    }

    public DadoTestePO(Metodos metodos, Parametros parametros, Double score) {
        this(metodos, parametros);
        setFitness(score);
    }

    @Override
    public DadoTeste copy() {
        return new DadoTestePO(getMetodos(), getParametros(), getFitness());
    }

    public Metodos getMetodos() {
        return metodos;
    }

    public void setMetodos(Metodos metodos) {
        this.metodos = metodos;
    }

    public Parametros getParametros() {
        return parametros;
    }

    public String nomeJUnit() {
        return "TestCase" + getId() + "_Ind" + getIndividuoId();
    }

    /**
     * Retorna parametros de um metodo
     * @param metodo
     * @return parametro
     */
    public Parametros getParamsByMethod(Metodo metodo) {

        Parametros params = new Parametros();

        int iParametro = 0;

        //conta os metodos do inicio até antes do metodo passado por parametro
        for (int i = 0; i < metodo.indice(); i++) {
            if (metodos.getMetodo(i).hasParametro()) {
                iParametro = iParametro + metodos.getMetodo(i).quantidadeParametros();
            }
        }

        for (int i = 0; i < metodo.quantidadeParametros(); i++) {
            Parametro p = parametros.getParametro(iParametro + i);
            params.adicionarParametros(p);
        }
        return params;
    }

    public void setParametros(Parametros parametros) {
        this.parametros = parametros;
    }

    public File gerarArquivoJUnit(DadoTestePO dado) {
        FormatarDadoTestePO parse = new FormatarDadoTestePO();
        String nomeJUnit = parse.desformatarDadoTeste(dado);
        File arquivo = Arquivo.escreva(dado.nomeJUnit() + ".java", Constantes.NOVA_PASTA_CUT, nomeJUnit);
        return arquivo;
    }

    public void compilarArquivoJUnit(File arquivoJUnit) {
        Main.compile(new String[]{"-cp", "lib/junit-4.1.jar:.", arquivoJUnit.toString(),
            "-d", Constantes.NOVA_PASTA_CUT
        });
    }

    @Override
    public String toString() {
        StringBuffer saida = new StringBuffer();

        saida.append(metodos.toString());
        saida.append(" @ ");
        saida.append(parametros.toString());

        return saida.toString();
    }

    @Override
    public boolean equals(Object object) {
        if (object == null || !this.getClass().equals(object.getClass())) {
            return false;
        }
        return true;
    }
    
    @Override
    public int hashCode() {
        int hash = 3;
        hash = 97 * hash + (this.metodos != null ? this.metodos.hashCode() : 0);
        hash = 97 * hash + (this.parametros != null ? this.parametros.hashCode() : 0);
        return hash;
    }
}
